SQL Injection(SQL 注入)是針對資料庫層的攻擊,攻擊者透過在輸入中注入惡意 SQL 片段,改變伺服器執行的查詢邏輯,進而讀取、修改或刪除資料庫內容,甚至取得系統控制權。這類漏洞在實務中仍頻繁發生,影響範圍從資料外洩到整個系統被破壞,風險極高。
⸻
一、攻擊原理(精簡說明)
應用程式把使用者輸入直接拼接進 SQL 查詢字串,導致攻擊者能構造額外的 SQL,改變原本查詢的語意。例如把驗證邏輯、where 條件或資料操作替換為攻擊者想要的指令。
二、簡單示範(具說明性的範例)
危險範例(不要在生產環境使用) — 以 PHP + MySQL 為例:
// 假設從 POST 取得使用者輸入的帳號
$username = $_POST['username'];
// 直接拼接 SQL(易受注入)
$sql = "SELECT * FROM users WHERE username = '$username' AND active = 1";
$result = mysqli_query($conn, $sql);
若攻擊者在 username 輸入:
' OR '1'='1
則組成的 SQL 可能成為:
SELECT * FROM users WHERE username = '' OR '1'='1' AND active = 1;
三、常見利用情境與後果
• 認證繞過:登入表單被繞過,攻擊者可當作合法使用者。
• 資料外洩:讀取敏感欄位(身分證、電子郵件、密碼雜湊)。
• 資料破壞:刪除或修改資料(DELETE、UPDATE)。
• 命令執行/資料庫側通道:在特定設定下可能進一步執行系統指令或上傳惡意程式。
⸻
四、防禦重點(落地可執行)
1. 使用參數化查詢(Prepared Statements)/綁定參數(首選)
• 所有 SQL 請求皆使用參數化語法,避免把使用者輸入直接拼接進字串。
• 範例(PHP mysqli prepared):
$stmt = $conn->prepare("SELECT * FROM users WHERE username = ? AND active = 1");
$stmt->bind_param("s", $username);
$stmt->execute();
⸻
五、實務建議(開發與營運)
• 在開發階段就把安全當作需求:把參數化、輸入驗證納入範本(template)與 code review checklist。
• 測試時納入注入測試案例:CI/CD pipeline 可加上自動化的安全掃描。
• 定期演練 Incident Response:若發現 SQL Injection 被利用,要能快速封鎖、回溯並修補。
• 教育團隊成員:讓前端、後端與 DBA 都理解注入的成因與防護方式,避免跨層誤解。
⸻
結語
SQL Injection 是可預防、卻代價高昂的漏洞。關鍵在於「永遠不要把未經處理的使用者輸入當成 SQL 字串的一部分」。採用參數化查詢、白名單驗證與最小權限等防護措施,並結合掃描與監控,才能從源頭與運維兩端有效降低風險。